package cn.kgc.springday05.proxys;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Author: 课工场
 * @Version: v1.0  2023/6/15
 * @Description:
 */
public class JDKProxy {
    // 被代理对象
    private Object target;

    public JDKProxy(Object object){
        this.target = object;
    }

    public Object  getProxy(){
        /*
        * ClassLoader loader    类加载器 jvm虚拟机不会为动态生成的代理类 分配累加器
        * interfaces[]  被代理对象实现的接口
        * InvocationHandler  增强业务编写的位置
        * */

        ClassLoader classLoader = this.getClass().getClassLoader();
        Class<?>[] interfaces = target.getClass().getInterfaces();
        InvocationHandler  invocationHandler = new InvocationHandler() {

            //  Method method  方法对象  代理对象调用的方法对象    Object[] args  通过代理对象调用方法时 传入的参数
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {


                // 被代理对象方法的调用
                Object invoke = null;
                try {
                    // 通知
                    System.out.println("===========上课时间到了================");  // 连接点
                    invoke = method.invoke(target, args);  //  切点
                    // 通知
                    System.out.println("===========下课时间到了================");  // 连接点
                } catch (Exception e) {
                    e.printStackTrace();
                    // 连接点
                } finally {
                    // 连接点
                }

                return invoke;
            }
        };
        // 代理对象
        Object o = Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
        return o;
    }
}
